import sys
import argparse
import pylab as pl
import matplotlib
import utils as ut
import methods

# 设置字体和画布大小
matplotlib.rc("font", family='MicroSoft YaHei')
pl.figure(figsize=(6, 4), dpi=240)

if __name__ == "__main__":
    # main.py可以接收以下参数
    # -d: 选择数据集，可选[KC3, PC2, PC4, Ant, Camel, MC1]
    # 单选且必须设置

    # -fs: 特征选取算法，用于获取特征集，可选[pearson, fisher, greedy]，多选时对比不同特征选择算法
    # 当探究特征选取算法时，建议设置为pearson fisher greedy
    # 当对比APE和其他算法时，请选择一个设置
    # 当不进行以上两个实验时，无需设置

    # -s: 指定评估模型的标准，可选[AUC, GMeans]
    # 必须设置，建议设置为AUC（GMeans不是所有实验都支持）

    # -n: 指定基分类器的数量。该参数的设定，用于探究基分类器数量对于APE模型性能的影响。
    # 当探究对《同构APE》的影响时，范围[1, 25]，建议设置为25，
    # 当探究对《异构APE》的影响时，范围[1, 11]，建议设置为11，
    # 当不探究以上两个问题时，不进行设置

    # -m: 指定使用的模型，可选[APE,RF,W_SVM]，当探究特征选择算法时，请不要输入此参数；当对比模型的表现时，请全部输入
    # 只有在对比ape和其他算法时设置，且建议设置为APE RF W_SVM

    # -e：指定要进行的实验，可选[0,1,2,3]
    # 0代表对比特征选择算法
    # 1代表对比模型
    # 2代表探究基分类器数量对同构APE的影响
    # 3代表探究基分类器数量对异构APE
    argv = sys.argv[1:]
    parser = argparse.ArgumentParser()

    parser.add_argument('-fs', '--fs_functions', nargs="+",
                        choices=["pearson", "fisher", "greedy"])
    parser.add_argument('-m', '--method', nargs="+",
                        choices=["RF", "W_SVM", "APE"])
    parser.add_argument('-d', '--dataset_name', default="ant",
                        choices=["KC3", "PC2", "PC4", "Ant", "Camel", "MC1"])
    parser.add_argument('-n', '--n_classifiers', default=-1, type=int)
    parser.add_argument('-s', '--score_name', required=True,
                        choices=["AUC", "GMeans"])
    parser.add_argument('-e', '--experiment', required=True,
                        choices=["0", "1", "2", "3", "4"])

    # 获取输入的参数
    args = parser.parse_args()
    method = args.method
    dataset_name = args.dataset_name
    fs_functions = args.fs_functions
    n_classifiers = args.n_classifiers
    score_name = args.score_name
    experiment = args.experiment

    # 打印参数信息
    print("\nDATASET: %s\nMETHOD: %s\nEXPERIMENT: %s\n" % (dataset_name, method, experiment))

    # 读取数据，所有的特征存储到X中，有/无缺陷的结果存储到y中
    X, y = ut.read_dataset("datasets/", dataset_name=dataset_name)
    # 设置绘图的标题和xy轴
    if experiment == "2" or experiment == "3":
        pl.xlabel("基分类器数", loc="right")
    elif experiment == "4":
        pl.xlabel("基分类器组合类型", loc="right")
    else:
        pl.xlabel("保留特征数", loc="right")
    pl.ylabel(score_name, loc="top")
    if experiment == "0":
        pl.title("特征选择算法对比\n" + dataset_name)
    elif experiment == "1":
        pl.title("缺陷预测算法对比\n" + dataset_name + " " + fs_functions[0])
    elif experiment == "2":
        pl.title("基分类器数量对同构APE性能的影响")
    elif experiment == "3":
        pl.title("基分类器数量对异构APE性能的影响\n" + dataset_name)
    elif experiment == "4":
        pl.title("基分类器组合对异构APE性能的影响\n" + dataset_name)

    methods.run_method(method, X, y, n_classifiers=n_classifiers, fs_functions=fs_functions,
                       score_name=score_name, experiment=experiment)

    pl.legend(loc="best")
    pl.show()
